//***************************************************************************//
//*
//* 内容摘要：FEC相关结构体定义
//*	
//* 当前版本：V1.0		
//* 作    者：zhfayuan
//* 完成日期：2016-8-21
//**************************************************************************//
#ifndef _H_FECINTERFACE_
#define _H_FECINTERFACE_

#include "SDCommDef.h"


//rtp扩展头 profile
#define FEC_RTP_EXHDR_PROFILE 18

//rtp扩展头占用字节
#define FEC_RTP_EXHDR_LEN      4


//rtp头加上扩展头占用字节: 
//rtp标准头占12字节，
//标准扩展头结构占4字节，其中2字节表示profile、2个字节表示扩展头长度
//扩展头内容占4字节
#define FEC_RTP_HDR_LEN        (12 + 4 + (FEC_RTP_EXHDR_LEN))

#define FEC_HDR_LEN             7

#define ERASER     0
#define NOT_ERASER 1


#define MAX_WATERMARK_LEN 8

//被保护的数据包的最大长度
#define MAX_FEC_SRC_PKT_LEN     ((FEC_2K_SIZE) - (FEC_RTP_HDR_LEN) - (FEC_HDR_LEN) - (MAX_WATERMARK_LEN))


//当前支持的分组大小, 注意增加分组大小的同时也在g_auGroupSize
//中增加一个成员，用于vandermonde算法预处理，枚举变量最好按大小顺序排列
typedef enum
{
    FEC_GROUPSIZE_4  = 4,
	FEC_GROUPSIZE_6  = 6,
	FEC_GROUPSIZE_8  = 8,
	FEC_GROUPSIZE_10 = 10,
	FEC_GROUPSIZE_12 = 12,
	FEC_GROUPSIZE_14 = 14, 
	FEC_GROUPSIZE_16 = 16,
	FEC_GROUPSIZE_20 = 20,
	FEC_GROUPSIZE_22 = 22,
	FEC_GROUPSIZE_28 = 28,
	FEC_GROUPSIZE_32 = 32,
	FEC_GROUPSIZE_64 = 64
}E_FEC_GROUP_SIZE;


#define MAX_FEC_REDUNDANCY			100
#define DEFAULT_FEC_REDUNDANCY		30
#define MIN_FEC_REDUNDANCY			10 


#define PAD_GROUP_SIZE				12
#define DEFAULT_GROUP_SIZE			FEC_GROUPSIZE_28
#define SUGGEST_GROUP_SIZE			FEC_GROUPSIZE_64
#define MAX_GROUP_SIZE				(FEC_GROUPSIZE_64 + PAD_GROUP_SIZE)
#define MIN_GROUP_SIZE				FEC_GROUPSIZE_4

//FEC 参数
typedef enum 
{
    e_fec_redundancy, //设置冗余度
	e_fec_group_size, //设置被保护的一组数据包的个数，默认为20
    e_fec_unknown_param
}E_FEC_PARAM_TYPE;

typedef struct
{
    UINT16 group_size;  
	UINT16 uiPacketMaxLen;
	UINT16 parity_num;
	UINT16 parity_avglen;    //用于输出生成的校验包平均长度
	UINT16 parity_lastlen;   //用于输出生成的校验包最后一个包的长度
	UINT16 fechdrLen;
}T_FEC_ENCODE_PARAM;

typedef struct 
{
    UINT32 group_size; //被保护的数据包个数
	UINT32 parity_num; //校验包个数
    UINT32 uiPacketMaxLen;
}T_FEC_DECODE_PARAM;

typedef struct
{
    UINT8   *pucData;        //收到的数据, 媒体数据 or 校验数据
    UINT32  uiDataLen;       //数据长度
	UINT32  uiLostFlag;      //丢失标志，表明次数据包是否丢失
    void*   pPacketBuffer;   //被保护的媒体数据对应的packetbuffer
}T_FEC_DATA;


#endif

